iT邦幫忙

2025 iThome 鐵人賽

DAY 18
0
Software Development

30天收斂後端開發心法系列 第 18

30天收斂後端開發心法 - (18) Laravel Mock

  • 分享至 

  • xImage
  •  

在撰寫 Laravel 的單元測試或整合測試時,我們常常會遇到以下情境:

有某個方法你「不想真的執行」,
而是希望它「假裝已執行並回傳你想要的結果」。

這時候就可以使用 Laravel 提供的 Mock 功能,模擬物件的行為,只回傳你指定的結果,不進行實際邏輯或資料庫操作。

實際情境:Mock 一個 Repository

假設我們的 Service 使用了 Repository,如下:

public function getUserList($employeeNo)
{
    $userRepository = app(UserRepository::class);
    $userList = $userRepository->get();
    return $userList;
}

我們不想在這個測試中真的執行 UserRepository::get(),因為這個 Repository 的測試已經獨立完成了。

測試中 Mock Repository

public function testGetUserList(): void
{
    $expect = User::factory()->count(2)->make(); // 使用 make() 不寫入資料庫

    $this->mock(UserRepository::class, function (MockInterface $mock) use ($expect) {
        $mock->shouldReceive('get')
            ->with() // 沒有參數
            ->andReturn($expect); // 回傳你預期的結果
    });
    $result = $this->userService->getUserList('EMP001');
    $this->assertEquals(2, $result->count()); // 建議把期望值放在前面
}

優點

  • 測試過程中 UserRepository::get() 不會真的被執行。
  • 你可以只專注在測試 Service 的邏輯是否正確。
  • 測試快速、穩定,避免因外部依賴(資料庫等)導致不確定性。

小結

Mock 是 Laravel 測試中非常好用的工具,它幫助我們:

  • 隔離單元(Unit)測試的範圍
  • 減少對資料庫或外部 API 的依賴
  • 提高測試速度與穩定性

上一篇
30天收斂後端開發心法 - (17) Laravel Tinker
下一篇
30天收斂後端開發心法 - (19) HTTP Client
系列文
30天收斂後端開發心法30
圖片
  熱門推薦
圖片
{{ item.channelVendor }} | {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言